﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Reflection.Emit;
using Caixa.BLL;

namespace Caixa
{
	#region " Enum "

	public enum TelaSistema
	{
		Inicial = 1,
		Acesso = 2,
		Operacoes = 3,
		Deposito = 4,
		Saque = 5,
		Consulta = 6
	}

	#endregion

	#region " Delegates "

	public delegate void TelaFecharHandler();

	#endregion

	public static class TelaSistemaManager
	{
		#region " Properts "

		public static Form FormFundo
		{
			get;
			set;
		}

		#endregion

		#region " Methods "

		public static void ShowModalTesteLogin(TelaSistema tela)
		{
			if (CaixaEletronicoBLL.IsLogado)
				TelaSistemaManager.ShowModal(tela);
			else
			{
				TelaSistemaManager.ShowModal(TelaSistema.Acesso, new TelaFecharHandler(delegate()
				{
					if (CaixaEletronicoBLL.IsLogado)
					{
						TelaSistemaManager.ShowModal(tela);
					}
				}));
			}
		}

		public static void ShowModal(TelaSistema tela)
		{
			Show(tela, null, true);
		}

		public static void ShowModal(TelaSistema tela, Delegate telaFechar)
		{
			Show(tela, telaFechar, true);
		}

		public static Form Show(TelaSistema tela)
		{
			return Show(tela, null, false);
		}

		public static Form Show(TelaSistema tela, Delegate telaFechar)
		{
			return Show(tela, telaFechar, false);
		}

		private static Form Show(TelaSistema tela, Delegate telaFechar, bool modal)
		{
			Form form = null;

			switch (tela)
			{
				case TelaSistema.Inicial:
					form = AbrirTela<Frm_Inicial>(telaFechar, modal);
					break;
				case TelaSistema.Operacoes:
					form = AbrirTela<Frm_Operacoes>(telaFechar, modal);
					break;
				case TelaSistema.Acesso:
					form = AbrirTela<Frm_Acesso>(telaFechar, modal);
					break;
				case TelaSistema.Deposito:
					form = AbrirTela<Frm_Deposito>(telaFechar, modal);
					break;
				case TelaSistema.Saque:
					form = AbrirTela<Frm_Saque>(telaFechar, modal);
					break;
				case TelaSistema.Consulta:
					form = AbrirTela<Frm_Consulta>(telaFechar, modal);
					break;
				default:
					break;
			}

			return form;
		}

		/// <summary>    
		/// Método genérico para abrir qualquer tela
		/// </summary>
		private static T AbrirTela<T>(Delegate telaFechar, bool modal)
		{
			T form = Activator.CreateInstance<T>();
			if (form != null)
			{
				Type type = form.GetType();

				// Define o Owner deste Form
				PropertyInfo property = type.GetProperty("Owner");
				if (property != null)
					property.SetValue(form, FormFundo, null);

				// Adiciona o evento para ao fechar o form atual, 
				// abrir o novo form passado como parâmetro				
				if (telaFechar != null)
				{
					EventInfo eventInfo = type.GetEvent("FormClosed");
					if (eventInfo != null)
					{
						eventInfo.AddEventHandler(form, new FormClosedEventHandler(delegate(object sender, FormClosedEventArgs e)
						{
							Type[] parms = new Type[] { };
							telaFechar.DynamicInvoke(parms);
						}));
					}
				}

				if (!modal)
				{
					Type[] parms = new Type[] { };
					MethodInfo method = type.GetMethod("Show", parms);
					if (method != null)
						method.Invoke(form, null);
				}
				else
				{
					Type[] parms = new Type[] { };
					MethodInfo method = type.GetMethod("ShowDialog", parms);
					if (method != null)
						method.Invoke(form, null);
					method = type.GetMethod("Dispose", parms);
					if (method != null)
						method.Invoke(form, null);
					form = default(T);
				}
			}
			return form;
		}

		#endregion
	}
}
